/*********************************************************************
 * Copyright (C) 2002 Andrew Khan
 * <p>
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * <p>
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * <p>
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ***************************************************************************/

package jxl.write;

import jxl.biff.DisplayFormat;
import jxl.format.Format;

/**
 * Static class which contains the available list of built in Number formats
 */
public final class NumberFormats {
    /**
     * Inner class which holds the format index
     */
    private static class BuiltInFormat implements DisplayFormat, Format {
        /**
         * The built in number format index
         */
        private int index;

        /**
         * The format string
         */
        private String formatString;

        /**
         * Constructor, using the predetermined index
         *
         * @param i the index
         * @param s the string
         */
        public BuiltInFormat(int i, String s) {
            index = i;
            formatString = s;
        }

        /**
         * Accessor for the format index
         *
         * @return the index
         */
        public int getFormatIndex() {
            return index;
        }

        /**
         * Accessor to determine if this format has been initialized.  Since it is
         * built in, this will always return TRUE
         *
         * @return TRUE, since this is a built in format
         */
        public boolean isInitialized() {
            return true;
        }

        /**
         * Determines whether this format is a built in format
         *
         * @return TRUE, since this is a built in numerical format
         */
        public boolean isBuiltIn() {
            return true;
        }

        /**
         * Initializes this format with a dynamically determined index value.
         * Since this is a built in, and hence the index value is predetermined,
         * this method has an empty body
         *
         * @param pos the pos in the number formats list
         */
        public void initialize(int pos) {
        }

        /**
         * Accesses the excel format string which is applied to the cell
         * Note that this is the string that excel uses, and not the java
         * equivalent
         *
         * @return the cell format string
         */
        public String getFormatString() {
            return formatString;
        }

        /**
         * Standard equals method
         *
         * @param o the object to compare
         * @return TRUE if the two objects are equal, FALSE otherwise
         */
        public boolean equals(Object o) {
            if (o == this) {
                return true;
            }

            if (!(o instanceof BuiltInFormat)) {
                return false;
            }

            BuiltInFormat bif = (BuiltInFormat) o;

            return index == bif.index;
        }

        /**
         * Standard hash code method
         *
         * @return the hash code
         */
        public int hashCode() {
            return index;
        }
    }


    // The available built in number formats
    // First describe the fairly bog standard formats

    /**
     * The default format.  This is equivalent to a number format of '#'
     */
    public static final DisplayFormat DEFAULT = new BuiltInFormat(0x0, "#");
    /**
     * Formatting for an integer number.  This is equivalent to a DecimalFormat
     * of "0"
     */
    public static final DisplayFormat INTEGER = new BuiltInFormat(0x1, "0");

    /**
     * Formatting for a float.  This formats number to two decimal places.  It
     * is equivalent to a DecimalFormat of "0.00"
     */
    public static final DisplayFormat FLOAT = new BuiltInFormat(0x2, "0.00");

    /**
     * Formatting for an integer that has a thousands separator.
     * Equivalent to a DecimalFormat of "#,##0"
     */
    public static final DisplayFormat THOUSANDS_INTEGER =
            new BuiltInFormat(0x3, "#,##0");

    /**
     * Formatting for a float that has a thousands separator.
     * Equivalent to a DecimalFormat of "#,##0.00"
     */
    public static final DisplayFormat THOUSANDS_FLOAT =
            new BuiltInFormat(0x4, "#,##0.00");

    /**
     * Formatting for an integer which is presented in accounting format
     * (ie. deficits appear in parentheses)
     * Equivalent to a DecimalFormat of "$#,##0;($#,##0)"
     */
    public static final DisplayFormat ACCOUNTING_INTEGER =
            new BuiltInFormat(0x5, "$#,##0;($#,##0)");

    /**
     * As ACCOUNTING_INTEGER except that deficits appear coloured red
     */
    public static final DisplayFormat ACCOUNTING_RED_INTEGER =
            new BuiltInFormat(0x6, "$#,##0;($#,##0)");

    /**
     * Formatting for an integer which is presented in accounting format
     * (ie. deficits appear in parentheses)
     * Equivalent to a DecimalFormat of  "$#,##0;($#,##0)"
     */
    public static final DisplayFormat ACCOUNTING_FLOAT =
            new BuiltInFormat(0x7, "$#,##0;($#,##0)");

    /**
     * As ACCOUNTING_FLOAT except that deficits appear coloured red
     */
    public static final DisplayFormat ACCOUNTING_RED_FLOAT =
            new BuiltInFormat(0x8, "$#,##0;($#,##0)");

    /**
     * Formatting for an integer presented as a percentage
     * Equivalent to a DecimalFormat of "0%"
     */
    public static final DisplayFormat PERCENT_INTEGER =
            new BuiltInFormat(0x9, "0%");

    /**
     * Formatting for a float percentage
     * Equivalent to a DecimalFormat "0.00%"
     */
    public static final DisplayFormat PERCENT_FLOAT =
            new BuiltInFormat(0xa, "0.00%");

    /**
     * Formatting for exponential or scientific notation
     * Equivalent to a DecimalFormat "0.00E00"
     */
    public static final DisplayFormat EXPONENTIAL =
            new BuiltInFormat(0xb, "0.00E00");

    /**
     * Formatting for one digit fractions
     */
    public static final DisplayFormat FRACTION_ONE_DIGIT =
            new BuiltInFormat(0xc, "?/?");

    /**
     * Formatting for two digit fractions
     */
    public static final DisplayFormat FRACTION_TWO_DIGITS =
            new BuiltInFormat(0xd, "??/??");

    // Now describe the more obscure formats

    /**
     * Equivalent to a DecimalFormat "#,##0;(#,##0)"
     */
    public static final DisplayFormat FORMAT1 =
            new BuiltInFormat(0x25, "#,##0;(#,##0)");

    /**
     * Equivalent to FORMAT1 except deficits are coloured red
     */
    public static final DisplayFormat FORMAT2 =
            new BuiltInFormat(0x26, "#,##0;(#,##0)");

    /**
     * Equivalent to DecimalFormat "#,##0.00;(#,##0.00)"
     */
    public static final DisplayFormat FORMAT3 =
            new BuiltInFormat(0x27, "#,##0.00;(#,##0.00)");

    /**
     * Equivalent to FORMAT3 except deficits are coloured red
     */
    public static final DisplayFormat FORMAT4 =
            new BuiltInFormat(0x28, "#,##0.00;(#,##0.00)");

    /**
     * Equivalent to DecimalFormat "#,##0;(#,##0)"
     */
    public static final DisplayFormat FORMAT5 =
            new BuiltInFormat(0x29, "#,##0;(#,##0)");

    /**
     * Equivalent to FORMAT5 except deficits are coloured red
     */
    public static final DisplayFormat FORMAT6 =
            new BuiltInFormat(0x2a, "#,##0;(#,##0)");

    /**
     * Equivalent to DecimalFormat "#,##0.00;(#,##0.00)"
     */
    public static final DisplayFormat FORMAT7 =
            new BuiltInFormat(0x2b, "#,##0.00;(#,##0.00)");

    /**
     * Equivalent to FORMAT7 except deficits are coloured red
     */
    public static final DisplayFormat FORMAT8 =
            new BuiltInFormat(0x2c, "#,##0.00;(#,##0.00)");

    /**
     * Equivalent to FORMAT7
     */
    public static final DisplayFormat FORMAT9 =
            new BuiltInFormat(0x2e, "#,##0.00;(#,##0.00)");

    /**
     * Equivalent to DecimalFormat "##0.0E0"
     */
    public static final DisplayFormat FORMAT10 =
            new BuiltInFormat(0x30, "##0.0E0");

    /**
     * Forces numbers to be interpreted as text
     */
    public static final DisplayFormat TEXT = new BuiltInFormat(0x31, "@");
}


